Файл: Life.txt

Дата: 10.04.2014

1: * Игра ЖИЗНЬ.
2: * Программа КОНЦЕПТ, 26.09.2013, www.gendoc.ru
3:
4: присвоить РАЗМЕР_ПОЛЯ 15
5: присвоить РАЗМЕР_ЯЧЕЙКИ 30
6: присвоить МНОЖЕСТВО_ЯЧЕЕК {}
7: присвоить НОМЕР_ПОКОЛЕНИЯ 1
8: присвоить ЦВЕТ_РОЖДЕНИЯ [$Синий]
9: присвоить МЕНЯТЬ_ЦВЕТ_ПОКОЛЕНИЙ 1
10:
11: Решетка_создать ПОЛЕ_ПРОТОТИП
12: сущность ПОЛЕ ПОЛЕ_ПРОТОТИП
13:   столбцов [РАЗМЕР_ПОЛЯ]  
14:   строк [РАЗМЕР_ПОЛЯ]  
15:   ширина_ячейки [РАЗМЕР_ЯЧЕЙКИ]
16:   высота_ячейки [РАЗМЕР_ЯЧЕЙКИ]
17: создать
18: память очистить ПОЛЕ_ПРОТОТИП
19:
20: Решетка_рассчитать ПОЛЕ
21: Решетка_рисовать ПОЛЕ
22:
23: * Начальная фигура
24: Рождение_ячейки 10 8 1
25: Рождение_ячейки 4 8 1  
26: Рождение_ячейки 5 8 1
27: Рождение_ячейки 6 8 1
28: Рождение_ячейки 7 10 1
29: Рождение_ячейки 7 11 1
30: Рождение_ячейки 7 12 1
31: Рождение_ячейки 7 4 1
32: Рождение_ячейки 7 5 1
33: Рождение_ячейки 7 6 1
34: Рождение_ячейки 8 8 1
35: Рождение_ячейки 9 8 1
36:
37: присвоить гор1 500 гор2 600
38: Рисовать_кнопку [гор1] 50 [гор2] 100 [$Салатовый] Шаг
39: Рисовать_кнопку [гор1] 100 [гор2] 150 [$Салатовый] Загрузить
40: Рисовать_кнопку [гор1] 150 [гор2] 200 [$Салатовый] Сохранить
41: Рисовать_кнопку [гор1] 200 [гор2] 250 [$Салатовый] Очистить
42: Рисовать_кнопку [гор1] 250 [гор2] 300 [$Розовый] Выход
43: рисовать текстВПрямоугольнике 480 300 620 400 'Кликая мышью, можно менять состояние клеток.'
44: память очистить гор1 гор2
45: Обновить_номер_поколения
46:
47: функция _$ВЫБОР
48: *  показать сообщение "[_$ВЫБОР;ОБЪЕКТ] [_$ВЫБОР;РЕЖИМ] [_$ВЫБОР;ГОР] [_$ВЫБОР;ВЕР]"
49:   выбрать [_$ВЫБОР;ОБЪЕКТ]
50:     вариант ПОЛЕ
51:      Решетка_определить_ячейку [_$ВЫБОР;ОБЪЕКТ] [_$ВЫБОР;ГОР] [_$ВЫБОР;ВЕР]
52:      Инвертировать_ячейку (Решетка_определить_ячейку [_$ВЫБОР;ОБЪЕКТ] [_$ВЫБОР;ГОР] [_$ВЫБОР;ВЕР] )
53:     вариант Шаг
54:       Новое_поколение
55:     вариант Загрузить
56:       Ячейки_загрузить
57:     вариант Сохранить
58:       Ячейки_сохранить
59:     вариант Очистить
60:       Ячейки_очистить
61:     вариант Выход
62:      рисовать конец  
63:       СТОП    
64:   конецВыбора
65: возврат
66:
67: функция Инвертировать_ячейку коорд
68:   память локальный гор вер
69:   список взять гор [коорд] 1  
70:   список взять вер [коорд] 2
71:   если (память существует $результат "ЯЧЕЙКА;[гор];[вер]" )  
72:     Гибель_ячейки [гор] [вер]
73:   иначе
74:     Рождение_ячейки [гор] [вер] [НОМЕР_ПОКОЛЕНИЯ]  
75:   конец
76: возврат
77:
78: функция Рождение_ячейки гор вер итерация
79:   присвоить "ЯЧЕЙКА;[гор];[вер][итерация]
80:   множество или МНОЖЕСТВО_ЯЧЕЕК $ "{[гор];[вер]}"
81:   Решетка_рисовать_фигуру ПОЛЕ ячейка [гор] [вер] [ЦВЕТ_РОЖДЕНИЯ]
82: возврат
83:
84: функция Гибель_ячейки гор вер
85:   память очистить "ЯЧЕЙКА;[гор];[вер]"        
86:   множество разность МНОЖЕСТВО_ЯЧЕЕК $ "{[гор];[вер]}"
87:   Решетка_рисовать_фигуру ПОЛЕ ячейка [гор] [вер] [$Белый]    
88: возврат
89:
90: функция Новое_поколение
91:   память локальный гор вер
92:   присвоить МНОЖЕСТВО_ДОБАВИТЬ {} МНОЖЕСТВО_УДАЛИТЬ {}
93:
94:   увеличить НОМЕР_ПОКОЛЕНИЯ
95:   Обновить_номер_поколения
96:   
97:   для гор (список сгенерить $результат 1 [ПОЛЕ;столбцов] )
98:     для вер (список сгенерить $результат 1 [ПОЛЕ;строк] )
99:       присвоить соседей (Количество_соседей [гор] [вер] )
100:       если (память существует $результат "ЯЧЕЙКА;[гор];[вер]" )  
101: * Клетка заполнена   
102:         если [соседей] < 2  
103:           множество или МНОЖЕСТВО_УДАЛИТЬ $ "{[гор];[вер]}"    
104:         конец
105:         если [соседей] > 3  
106:           множество или МНОЖЕСТВО_УДАЛИТЬ $ "{[гор];[вер]}"    
107:         конец
108:       иначе      
109: * Клетка пустая   
110:         если [соседей] = 3  
111:           множество или МНОЖЕСТВО_ДОБАВИТЬ $ "{[гор];[вер]}"    
112:         конец
113:       конец
114:     следующий
115:   следующий
116:
117:   если [МЕНЯТЬ_ЦВЕТ_ПОКОЛЕНИЙ]  
118:     список выбратьСлучайный ЦВЕТ_РОЖДЕНИЯ "[$Синий];[$Красный];[$Желтый];[$Зеленый];[$Черный]"      
119:   конец
120:
121:   для [МНОЖЕСТВО_ДОБАВИТЬ]
122:     список взять гор [$ОбъектЦикла] 1  
123:     список взять вер [$ОбъектЦикла] 2
124:     Рождение_ячейки [гор] [вер] [НОМЕР_ПОКОЛЕНИЯ]
125:   следующий
126:   для [МНОЖЕСТВО_УДАЛИТЬ]
127:     список взять гор [$ОбъектЦикла] 1  
128:     список взять вер [$ОбъектЦикла] 2
129:     Гибель_ячейки [гор] [вер]
130:   следующий
131: возврат
132:
133: функция Количество_соседей гор вер  
134:   память локальный рез
135:   присвоить рез 0
136:
137:   увеличить рез (Проверь_соседа [гор] [вер] -1 -1 )
138:   увеличить рез (Проверь_соседа [гор] [вер] -1 0 )
139:   увеличить рез (Проверь_соседа [гор] [вер] -1 1 )
140:   увеличить рез (Проверь_соседа [гор] [вер] 0 -1 )
141:   увеличить рез (Проверь_соседа [гор] [вер] 0 1 )
142:   увеличить рез (Проверь_соседа [гор] [вер] 1 -1 )
143:   увеличить рез (Проверь_соседа [гор] [вер] 1 0 )
144:   увеличить рез (Проверь_соседа [гор] [вер] 1 1 )
145:
146:   присвоить $результат [рез]
147: возврат
148:
149: функция Проверь_соседа гор вер смещ_гор смещ_вер
150:   память локальный рез
151:   увеличить гор [смещ_гор]
152:   увеличить вер [смещ_вер]
153:
154:   если (память существует $результат "ЯЧЕЙКА;[гор];[вер]" )  
155:     присвоить рез 1
156:   иначе
157:     присвоить рез 0
158:   конец
159:   присвоить $результат [рез]
160: возврат
161:
162: функция Ячейки_очистить
163:   для [МНОЖЕСТВО_ЯЧЕЕК]
164:     список взять гор [$ОбъектЦикла] 1  
165:     список взять вер [$ОбъектЦикла] 2
166:     Гибель_ячейки [гор] [вер]
167:   следующий
168:   присвоить НОМЕР_ПОКОЛЕНИЯ 1
169:   Обновить_номер_поколения
170:   присвоить ЦВЕТ_РОЖДЕНИЯ [$Синий]
171: возврат
172:
173: функция Ячейки_загрузить
174:   память локальный гор вер строка
175:   ввести переменная имя_файла 'Загрузить из файла:' 1
176:   если [$УспешныйВвод]  
177:     Ячейки_очистить
178:     файл читать "[$ТекущийКаталог][имя_файла].fld"
179:     файл читатьСтроку НОМЕР_ПОКОЛЕНИЯ  
180:     Обновить_номер_поколения
181:     файл читатьСтроку строка
182:     пока [$СтрокаПрочитана]  
183:       список взять гор [строка] 1  
184:       список взять вер [строка] 2
185:       список взять строка [строка] 3
186:       Рождение_ячейки [гор] [вер] [строка]
187:       файл читатьСтроку строка
188:     цикл
189:     файл конецЧтения
190:     показать сообщение Загрузил!
191:   конец
192: возврат
193:
194: функция Ячейки_сохранить
195:   память локальный гор вер
196:   ввести переменная имя_файла 'Сохранить в файл:' 1
197:   если [$УспешныйВвод]  
198:     файл писать "[$ТекущийКаталог][имя_файла].fld"
199:     >[НОМЕР_ПОКОЛЕНИЯ]
200:     для [МНОЖЕСТВО_ЯЧЕЕК]
201:       список взять гор [$ОбъектЦикла] 1  
202:       список взять вер [$ОбъектЦикла] 2
203:       >[гор];[вер];[ЯЧЕЙКА;[гор];[вер]]
204:     следующий
205:     файл конецЗаписи
206:     показать сообщение Сохранил!
207:   конец  
208: возврат
209:
210: функция Обновить_номер_поколения
211:   присвоить $ЦветТекста [$Черный] $ЦветКисти [$Белый] $ТипКисти 1 $ЦветЛинии [$Белый]
212:   рисовать прямоугольник 500 0 600 50
213:   рисовать текстВПрямоугольнике 500 0 600 50 "Поколение: [НОМЕР_ПОКОЛЕНИЯ]"
214: возврат
215:
216:
217: ******************************************************
218: *** БИБЛИОТЕКА ГРАФИКА
219: ******************************************************
220:
221:
222: функция Рисовать_кнопку x1 y1 x2 y2 цвет текст
223:   присвоить $ТолщинаЛинии 1 $ЦветЛинии [цвет] $ЦветКисти [цвет] $ТипКисти 1
224:   рисовать прямоугольник [x1] [y1] [x2] [y2]
225:   присвоить $ТипКисти 2 $ЦветЛинии 1
226:   рисовать прямоугольник [x1] [y1] [x2] [y2]
227:   присвоить $ТипКисти 2 $ЦветТекста 1 $ТипТекста 0
228:   рисовать текстВПрямоугольнике [x1] [y1] [x2] [y2] [текст]
229:   рисовать добавитьСенсор [x1] [y1] [x2] [y2] [текст]
230: возврат
231:
232: функция Рисовать_кнопки список_кнопок
233:   память локальный x1 y1 x2 y2 y3
234:
235:   присвоить x1 850 y1 0 x2 1200 y2 40 y3 30
236:
237:   для [список_кнопок]
238:     Рисовать_кнопку [x1] [y1] [x2] (вычислить + $результат [y1] [y2] ) 16 [$ОбъектЦикла]
239:     увеличить y1 [y2]
240: *    увеличить y1 -1
241:   следующий
242:
243:   присвоить $ТипКисти 1 $ЦветКисти 16 $ЦветЛинии [$ЦветКисти]
244:   рисовать прямоугольник [x1] [y1] [x2] 5000
245: возврат
246:
247:
248: ******************************************************
249: *** БИБЛИОТЕКА РЕШЕТКА
250: ******************************************************
251:
252:
253: функция Решетка_создать решетка
254:   сущность [решетка]
255:     коорд_гор_1 0
256:     коорд_вер_1 [[решетка];коорд_гор_1]
257:     столбцов 10  
258:     строк [[решетка];столбцов]
259:     ширина_ячейки 30
260:     высота_ячейки [[решетка];ширина_ячейки]
261:     толщина_линии 1
262:     цвет_фона [$белый]
263:     цвет_линии [$черный]    
264:   создать
265: возврат
266:
267: функция Решетка_рассчитать решетка
268:     вычислить + "[решетка];коорд_гор_2" [[решетка];коорд_гор_1] (вычислить * $результат  [[решетка];столбцов]  [[решетка];ширина_ячейки] )
269:     вычислить + "[решетка];коорд_вер_2" [[решетка];коорд_вер_1] (вычислить * $результат  [[решетка];строк]  [[решетка];высота_ячейки] )
270: возврат
271:
272: функция Решетка_рисовать решетка
273:   память локальный смещение
274:
275:   присвоить $ЦветКисти [[решетка];цвет_фона] $ЦветЛинии [[решетка];цвет_линии]
276:   присвоить $ТипКисти 1 $ТипЛинии 1 $ТолщинаЛинии [[решетка];толщина_линии]
277:
278:   рисовать прямоугольник [[решетка];коорд_гор_1] [[решетка];коорд_вер_1] [[решетка];коорд_гор_2] [[решетка];коорд_вер_2]
279:
280:   если [[решетка];толщина_линии] > 0
281:     * Разделители столбцов
282:     присвоить смещение [[решетка];коорд_гор_1]
283:     для (список сгенерить $результат 0 [[решетка];столбцов] )
284:       рисовать линия [смещение] [[решетка];коорд_вер_1] [смещение] [[решетка];коорд_вер_2]
285:       увеличить смещение [[решетка];ширина_ячейки]  
286:     следующий
287:
288:     * Разделители строк
289:     присвоить смещение [[решетка];коорд_вер_1]
290:     для (список сгенерить $результат 0 [[решетка];строк] )
291:       рисовать линия [[решетка];коорд_гор_1] [смещение] [[решетка];коорд_гор_2] [смещение]  
292:       увеличить смещение [[решетка];ширина_ячейки]  
293:     следующий
294:   конец
295:
296:   рисовать добавитьСенсор [[решетка];коорд_гор_1] [[решетка];коорд_вер_1] [[решетка];коорд_гор_2] [[решетка];коорд_вер_2] [решетка]  
297: возврат
298:
299: функция Решетка_определить_ячейку решетка х у
300:   вычислить - х $ [[решетка];коорд_гор_1]  
301:   вычислить делитьЦелое гор [х] [[решетка];ширина_ячейки]  
302:   увеличить гор
303:
304:   вычислить - у $ [[решетка];коорд_вер_1]  
305:   вычислить делитьЦелое вер [у] [[решетка];высота_ячейки]  
306:   увеличить вер
307:
308: *  показать сообщение "[гор] [вер]"
309:   присвоить $результат "[гор];[вер]"
310: возврат
311:
312: функция Решетка_рисовать_фигуру решетка фигура гор вер цвет текст
313:   увеличить гор -1
314:   увеличить вер -1
315:   вычислить + гор_1 [[решетка];коорд_гор_1] (вычислить * $результат  [гор]  [[решетка];ширина_ячейки] )
316:   вычислить + вер_1 [[решетка];коорд_вер_1] (вычислить * $результат  [вер]  [[решетка];высота_ячейки] )
317:   вычислить + гор_2 [гор_1] [[решетка];ширина_ячейки]  
318:   вычислить + вер_2 [вер_1] [[решетка];высота_ячейки]
319:
320:   если [[решетка];толщина_линии] > 0
321:     увеличить гор_1 1
322:     увеличить вер_1 1
323:   конец
324:
325:   присвоить $ЦветКисти [цвет] $ЦветЛинии [цвет]
326:   присвоить $ТипКисти 1 $ТипЛинии 1 $ТолщинаЛинии 1
327:   
328:   выбрать [фигура]
329:     вариант ячейка  
330:       рисовать прямоугольник [гор_1] [вер_1] [гор_2] [вер_2]
331:     вариант круг
332:       рисовать круг [гор_1] [вер_1] [гор_2] [вер_2]
333:     вариант окружность
334:       присвоить $ТипКисти 2 $ТолщинаЛинии 3
335:       рисовать круг [гор_1] [вер_1] [гор_2] [вер_2]
336:     вариант текст
337:       рисовать текстВПрямоугольнике [гор_1] [вер_1] [гор_2] [вер_2] [текст]
338:     другойВариант
339:       показать сообщение "Не умею рисовать [фигура]."            
340:   конецВыбора
341:
342: возврат
343:
344: функция Решетка_написать_слово решетка гор вер направление текст
345:   для (строка кСписку $результат [текст] )
346:     Решетка_рисовать_фигуру [решетка] текст [гор] [вер] [[решетка];цвет_фона] [$ОбъектЦикла]
347:     выбрать [направление]
348:       вариант гор
349:         увеличить гор    
350:       вариант вер
351:         увеличить вер                    
352:       другойВариант
353:         увеличить гор                    
354:         увеличить вер    
355:     конецВыбора
356:   следующий
357: возврат
358: